home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / etc / hotplug / dasd.agent < prev    next >
Text File  |  2006-05-01  |  6KB  |  252 lines

  1. #!/bin/sh
  2. #
  3. # Dasd hotplug policy agent for Linux 2.4 kernels
  4. #
  5. # Copyright (c) 2002 SuSE Linux AG, Nuremberg
  6. #
  7. # the GNU Public License applies
  8. #
  9. # Author:  Susanne Oberhauser <froh@suse.de>, 2002
  10. #
  11. #
  12. # Kernel DASD hotplug params include:
  13. #
  14. #   s390 device address
  15. : ${DEVNO?Bad DASD invocation: \$DEVNO is not set}
  16.  
  17. #   Linux major and minor
  18. : ${MAJOR?Bad DASD invocation: \$MAJOR is not set}
  19. : ${MINOR?Bad DASD invocation: \$MINOR is not set}
  20.  
  21. #   Linux device name (dasda, ...)
  22. : ${DASDNAME?Bad DASD invocation: \$DASDNAME is not set}
  23.  
  24. #   Hotplug event type (add, remove, partchk or partremove)
  25. : ${ACTION?Bad DASD invocation: \$ACTION is not set}
  26.  
  27. #
  28. # they are generated here: /usr/src/linux/drivers/s390/block/dasd.c
  29. #
  30.  
  31. #
  32. # HISTORY:
  33. #
  34. # 2002-08-06 Susanne Oberhauser <froh@suse.de>
  35. #            created script
  36.  
  37. cd /etc/hotplug
  38. . hotplug.functions
  39.  
  40. ( test -d /dev/dasd && test -d /dev/labels ) || {
  41.     debug_mesg "/etc/init.d/boot.dasd_devfs_compat is not started.
  42. ignoring $ACTION  $DEVNO  $MAJOR $MINOR  $DASDNAME"
  43.     exit 0
  44. }
  45.  
  46. mesg "$ACTION  $DEVNO  $MAJOR $MINOR  $DASDNAME"
  47.  
  48.  
  49. test -r dasd.permissions && . dasd.permissions || {
  50.     mesg DASD permission handling not found
  51.     exit 1
  52. }
  53.  
  54. # to preserve the script from doing anything real, call it with
  55. # CONDOM=echo
  56. : ${CONDOM=}
  57. # abort on error or unset variables:
  58. set -o errexit
  59. set -o nounset
  60.  
  61. die() {
  62.     mesg "$*"
  63.     exit 1
  64. }
  65.  
  66.  
  67. create_node() #
  68. # environment:
  69. #  TYPE (char, block)
  70. #  NODE (filename including any leading directories)
  71. #  MAJOR, MINOR
  72. #  OWNER (user.group or unset, which means)
  73. #  PERMISSIONS (symbolic or unset, which means minimal settings)
  74. #
  75. # when this function exits sucessfully,
  76. # $NODE exists as $TYPE-device with $MAJOR and $MINOR, belongs to
  77. # $OWNER and has $PERMISSIONS.
  78.  
  79. {
  80.     debug_mesg "create_node  $PERMISSIONS $OWNER $MAJOR $MINOR $TYPE $NODE"
  81.     case "$TYPE" in
  82.     block|b) TYPE=b;;
  83.     char|c)  TYPE=c;;
  84.     *) die "create_node: wrong TYPE given"
  85.     esac
  86.  
  87.  
  88.     # Don't remove the node, if it has the correct major/minor
  89.  
  90.     if test -e "$NODE"
  91.     then
  92.  
  93.     # if the file exists, check that it is a $TYPE device with the
  94.     # correct major and minor
  95.  
  96.     if test -$TYPE "$NODE"
  97.     then
  98.         ls -l $NODE | {
  99.  
  100.         read existing_mode existing_nlink \
  101.             existing_user existing_group \
  102.             existing_major existing_minor \
  103.             dummy
  104.  
  105.         if test "$existing_major" != "$MAJOR," || test "$existing_minor" != "$MINOR"
  106.         then
  107.             # create a new node using the existing
  108.             # permissions, ownership and timestamp
  109.             $CONDOM rm -f $NODE
  110.             $CONDOM mknod --mode="a="  $NODE $TYPE $MAJOR $MINOR
  111.         fi
  112.         }
  113.     else
  114.             # create a new node using the existing
  115.             # permissions, ownership and timestamp
  116.         $CONDOM rm -f $NODE
  117.         $CONDOM mknod --mode="a="  $NODE $TYPE $MAJOR $MINOR
  118.     fi
  119.     else
  120.     # TODO?: this does not support missing directories, yet:
  121.     # if the node does not exist yet, create it
  122.     $CONDOM mknod --mode="a="  $NODE $TYPE $MAJOR $MINOR
  123.     fi
  124.  
  125.     # always set ownership and permissions
  126.     $CONDOM chown $OWNER       $NODE
  127.     $CONDOM chmod $PERMISSIONS $NODE
  128. }
  129.  
  130.  
  131. create_symlink()
  132. # uses these from the environment:
  133. # LINK
  134. # TARGET
  135. # OWNER (user.group) of the link.  Directory components belong to root.root
  136. # CONDOM
  137. {
  138.     debug_mesg "create_symlink $OWNER  $LINK -> $TARGET"
  139.     # first create the directory if necessary:
  140.     link_dir=$(dirname "$LINK")
  141.     test -d "$link_dir" || {
  142.     test -e "$link_dir" && die "$link_dir exists but is not a directory:
  143. $(ls -l $link_dir)"
  144.     } || {
  145.     $CONDOM install --directory --owner=root --group=root "$link_dir"
  146.     }
  147.     test -e "$LINK" && rm -rf "$LINK"
  148.     $CONDOM ln -snf "$TARGET" "$LINK"
  149.     $CONDOM chown   "$OWNER"  "$LINK"
  150. }
  151.  
  152. case $ACTION in
  153.     add)
  154.     export NODE=/dev/$DASDNAME
  155.     export TYPE=block
  156.     # get $OWNER and $PERMISSIONS
  157.     MISC=$DEVNO \
  158.         dasd_permissions
  159.     create_node
  160.     LINK=/dev/dasd/$DEVNO/device TARGET=$NODE \
  161.         create_symlink
  162.     LINK=/dev/dasd/$DEVNO/disk TARGET=$NODE \
  163.         create_symlink
  164.     ;;
  165.  
  166.     remove)
  167.     $CONDOM rm -f /dev/$DASDNAME*
  168.     VOLSER=$(ls -l /dev/dasd/$DEVNO/VOLSER | sed -e 's,.*-> ,,')
  169.     $CONDOM rm -rf /dev/dasd/$DEVNO
  170.     test "${VOLSER}" != "" && $CONDOM rm -f "$VOLSER"
  171.     ;;
  172.  
  173.     partchk)
  174.     export NODE=/dev/$DASDNAME
  175.     export VOLSER=$(dasdview -j -f $NODE | sed -e 's,[[:space:]]\+$,,')
  176.     CHECKED_VOLSER=$(
  177.         echo "$VOLSER" |
  178.         sed -e '
  179.         # spaces, slashes, asterisks and questionmarks are no good for filenames
  180.         s/[ /*?]/  space, slash, asterisk or questionmark /g
  181.         # nor are nonprinting characters
  182.         s/[^[:print:]]/ nonprinting characters /g
  183.         # "." and ".." are evil as well
  184.         s/^\.$/ dot /
  185.         s/^\.\.$/ dot dot /
  186.         '
  187.         )
  188.  
  189.     if test "$VOLSER" != "$CHECKED_VOLSER"
  190.         then
  191.         mesg "VOLSER label of $NODE is no legal filename: <$VOLSER> ->  <$CHECKED_VOLSER> ignoring it."
  192.         VOLSER=""
  193.     fi
  194.         
  195.  
  196.     # If the volser label has changed, this is also notified as a
  197.     # 'partchk' action.  remove the old volser if present and
  198.     # different from the new one.
  199.  
  200.     # The VOLSER symlink in the DEVNO directory points to the
  201.     # VOLSER file for deletion of the VOLSER label after device
  202.     # removal (the device is no longer available then to query the
  203.     # VOLSER from there).
  204.  
  205.     test -e /dev/dasd/$DEVNO/VOLSER && {
  206.         OLD_VOLSER="$(ls -l /dev/dasd/$DEVNO/VOLSER | sed -e 's,.*-> ,,')"
  207.         test "$OLD_VOLSER" = "/dev/labels/$VOLSER" || {
  208.         $CONDOM rm -f "$OLD_VOLSER"
  209.         }
  210.     }
  211.  
  212.     # Get ownership and permissions for the nodes and ownership
  213.     # for the symlinks:
  214.  
  215.     MISC=$VOLSER-$DEVNO \
  216.         dasd_permissions
  217.     # add the volser symlink if no other dasd uses that volser yet.
  218.     test "$VOLSER" != "" && test ! -e /dev/labels/"$VOLSER" && {
  219.         LINK=/dev/labels/"$VOLSER" TARGET=../dasd/$DEVNO \
  220.         create_symlink
  221.  
  222.         TARGET=/dev/labels/"$VOLSER" LINK=/dev/dasd/$DEVNO/VOLSER \
  223.         create_symlink
  224.     }
  225.  
  226.     # TODO: for the time being, we ignore /proc/partitions and
  227.     # create all candidate partitions
  228.     export TYPE=block
  229.     for partition in 1 2 3
  230.       do
  231.  
  232.       NODE=/dev/$DASDNAME$partition
  233.  
  234.       # get ownership and permissions for the partition
  235.       MISC="$VOLSER"-$DEVNO-$partition dasd_permissions
  236.  
  237.       MINOR=$((MINOR + partition)) create_node
  238.  
  239.       LINK=/dev/dasd/$DEVNO/part$partition TARGET=$NODE \
  240.           create_symlink
  241.     done
  242.     ;;
  243.  
  244.     partremove)
  245.     $CONDOM rm -f /dev/$DASDNAME[123]
  246.     $CONDOM rm -rf /dev/dasd/$DEVNO/part*
  247.     ;;
  248.     *)
  249.     mesg DASD $ACTION event not supported
  250.     exit 1 ;;
  251. esac
  252.